const config = require("@/config");
/***************/
//封装post，get请求
/***************/

class Ajax {
  /**
   * @param url 地址
   * @param params 请求参数
   * @description params如果有isLoading字段，那么请求时就会loading加载,请求完成会自动关闭
   * @param method 请求类型，默认get
   * */
  ajax(url, params, method = 'get') {
    let obj = {
      url: url,
      method: method
    };
    if (params) {
      obj.data = params;
    }
    return this.request(obj);
  }

  request(options) {
    if (!options) {
      return;
    }

    let params = {};

    if (typeof options === 'string') {
      params.url = config.serverUrl + options;
      params.method = 'GET';
    } else if (typeof options === 'object') {
      if (!options.url) {
        return;
      }

      params.url = config.serverUrl + options.url;
      params.method = options.method || 'GET';//默认get
      params.data = this.dealObjectValue(options.data) || {};
    }

    return new Promise((resolve, reject) => {
      let header = {
        "Content-Type": "application/json",
        "XX-Device-Type": "uniApp",//平台类型
        "XX-Wxapp-AppId": config.appId,// appId
      };
      let {token} = uni.$API.UserAuth.getUserInfo();
      if (token) {
        header['XX-Token'] = token;
      }
      let opt = Object.assign(params, {
        header: header,
        complete: res => {
          if (params.data.hasOwnProperty('isLoading')) { // 判断是否需要loading,有就关闭
            uni.$Fun.hideLoading();
          }
          let currentPagesInfo = getCurrentPages();
          if (currentPagesInfo && currentPagesInfo.length) {
            /** 获取当前的页面信息*/
            // let $page = currentPagesInfo[0]['$page'];
            //console.log('$page:', currentPagesInfo, $page);
          }
          if (res && res.statusCode === 200) { // 获取成功
            // ... 这里可以统一处理一些方法  例如：token失效问题
            resolve(res.data)
          } else if (res && res.statusCode === 404) {
            // ... 页面 404
          } else {//获取失败
            reject(res);
          }
        }
      });
      if (params.data.hasOwnProperty('isLoading')) { // 判断是否需要loading
        uni.$Fun.showLoading();
      }
      uni.request(opt);
    });
  }

  /**
   * 处理对象参数值，排除对象参数值为”“、null、undefined，并返回一个新对象
   **/
  dealObjectValue(obj) {
    let param = {};
    if (obj === null || obj === undefined || obj === "") return param;
    for (let key in obj) {
      if (this.dataType(obj[key]) === "Object") {
        param[key] = this.dealObjectValue(obj[key]);
      } else if (obj[key] !== null && obj[key] !== undefined && obj[key] !== "") {
        param[key] = obj[key];
      }
    }
    return param;
  };

  /**
   *  判断传入参数的类型，以字符串的形式返回
   *  @obj：数据
   **/
  dataType(obj) {
    if (obj === null) return "Null";
    if (obj === undefined) return "Undefined";
    return Object.prototype.toString.call(obj).slice(8, -1);
  };
}

module.exports = new Ajax();
